package kyssion.leetcode.num201_250;

import java.util.HashSet;
import java.util.Set;

public class code202_快乐数 {

    /**
     * 方法1 其实就是会产生循环，通过hash 来判断是否循环
     */
    Set<Integer> set = new HashSet<>();
    public boolean isHappy2(int n) {
        int result = 0;
        while(n > 0){
            int i = n % 10;
            result += i*i;
            n /= 10;
        }
        if(set.contains(result)) return false;
        else set.add(result);
        if(result == 1) return true;
        return isHappy(result);
    }

    /**
     * 方法2 因为知道了是会产生循环节的原因，我们只需要通过使用 1 2 进步法就可以处理循环节的问题了
     * @param n
     * @return
     */
    private int calc(int n){
        int next = 0;
        while(n>0){
            int digit = n % 10;
            n /= 10;
            next+=digit*digit;
        }
        return next;
    }
    public boolean isHappy(int n) {
        int slow = n;
        int fast = n;
        while(true){
            slow = calc(slow);
            fast = calc(calc(fast));
            if (fast == 1) return true;
            if(slow == fast) return false;
        }
    }
}
